package com.laity.single.enums;

import java.lang.reflect.Constructor;

/**
 * @author: Laity
 * @Project: JavaLaity
 * @Package: com.laity.single.enums.EnumSingle
 * @Date: 2023年11月20日 23:40
 * @Description: 基于枚举解决反射的破坏
 * enum是一个什么？本身也是一个Class类
 */

public enum EnumSingle {
    INSTANCE;

    public EnumSingle getInstance() {
        return INSTANCE;
    }
}


class Test {
    public static void main(String[] args) throws Exception {
        EnumSingle instance1 = EnumSingle.INSTANCE;
        EnumSingle instance2 = EnumSingle.INSTANCE;
        System.out.println(instance2 == instance1);  // true

        // 尝试反射破坏枚举
        // private EnumSingle(String s, int i) 通过编译后可以看到参数
        // 这里需要注意 一定不要写成Integer
        Constructor<EnumSingle> declaredConstructor = EnumSingle.class.getDeclaredConstructor(String.class, int.class);
        declaredConstructor.setAccessible(true);
        EnumSingle enumSingle = declaredConstructor.newInstance();

        // java.lang.NoSuchMethodException: com.laity.single.enums.EnumSingle.<init>()
        // 没有空参构造器
        System.out.println(instance1);
        System.out.println(enumSingle);
    }
}
